package com.ht.api.db.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.nio.file.Files;

import cn.hutool.core.io.IoUtil;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class WxFileUtils {
	/**
	 * 根据url下载文件
	 * @param ossUrl
	 * @return
	 */
	public static File downFile(String ossUrl) {
	    File file = null;
	    try {
	        HttpResponse response = HttpUtil.createGet(ossUrl).execute();
	        
	        // 从Content-Disposition头部获取文件名（包含扩展名）
	        String fileName = extractFileNameFromContentDisposition(response);
	        
	        // 如果头部没有文件名，则从URL获取（不含查询参数）
	        if(fileName == null || fileName.isEmpty() || !fileName.contains(".")) {
	            fileName = extractFileNameFromUrl(ossUrl);
	            // 根据Content-Type添加扩展名
	            fileName = addExtensionIfMissing(fileName, response.header("Content-Type"));
	        }
	        
	        System.out.println("fileName: " + fileName);

	        File fold = Files.createTempDirectory("htjava-temp").toFile();
	        file = new File(fold, fileName);
	        
	        try (OutputStream out = new FileOutputStream(file)) {
	            IoUtil.copy(response.bodyStream(), out, IoUtil.DEFAULT_BUFFER_SIZE);
	        }
	        response.close();
	        return file;
	    } catch (Exception e) {
	        e.printStackTrace();
	        throw new RuntimeException(e);
	    }
	}

	/**
	 * 从Content-Disposition头部提取文件名
	 */
	private static String extractFileNameFromContentDisposition(HttpResponse response) {
	    String disposition = response.header("Content-Disposition");
	    if(disposition != null && disposition.contains("filename=")) {
	        // 处理格式：attachment; filename="MEDIA_ID.jpg"
	        String fileName = disposition.split("filename=")[1];
	        // 移除可能的引号
	        return fileName.replace("\"", "").trim();
	    }
	    return null;
	}

	/**
	 * 从URL中安全提取文件名（不含查询参数）
	 */
	private static String extractFileNameFromUrl(String url) {
	    // 移除查询参数和哈希部分
	    String baseUrl = url.split("[?#]")[0];
	    // 获取最后一部分
	    String name = baseUrl.substring(baseUrl.lastIndexOf("/") + 1);
	    // 如果没有有效文件名，使用默认名
	    return name.isEmpty() ? "download_" + System.currentTimeMillis() : name;
	}

	/**
	 * 根据Content-Type为文件名添加合适的扩展名
	 */
	private static String addExtensionIfMissing(String fileName, String contentType) {
	    // 如果文件名已有扩展名，不做处理
	    if(fileName.contains(".")) {
	        return fileName;
	    }
	    
	    // 根据Content-Type添加扩展名
	    if(contentType != null) {
	        switch(contentType) {
	            case "image/jpeg":
	                return fileName + ".jpg";
	            case "image/png":
	                return fileName + ".png";
	            case "application/pdf":
	                return fileName + ".pdf";
	            case "video/mpeg4":
	            	return fileName + ".mp4";
	            case "audio/amr":
	            	return fileName + ".amr";
	            // 添加更多类型...
	            default:
	                // 从contentType中提取主类型作为扩展名
	                String ext = contentType.split("/")[1];
	                return fileName + "." + ext;
	        }
	    }
	    
	    // 默认添加.tmp扩展名
	    return fileName + ".tmp";
	}
    
    
}
